home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / ikap / etc / f45 / f45type.c < prev    next >
C/C++ Source or Header  |  2000-05-08  |  3KB  |  173 lines

  1. /*
  2. 「4x5ドットビットマップフォントを使ってファイル内容をタイプ
  3. (プロプーショナル対応?)
  4. */
  5.  
  6. #include    <stdio.h>
  7. #include    <graph.h>
  8.  
  9. #include    "aspf45.inc"    //f45csrc デ コンバート シタ ファイル
  10.  
  11. /*
  12. patnumのデータ(4x5ドットビットマップ)を指定座標からに表示
  13. パターンの横幅をかえす
  14. */
  15. int    putF45(fx,fy,patnum)
  16. int    fx,fy,patnum;
  17. {
  18.     int    x,y,b,pat;
  19.     unsigned char buf[4];
  20.  
  21.     buf[0]=0;
  22.     buf[1]=F45pat[patnum][0];
  23.     buf[2]=F45pat[patnum][1];
  24.     buf[3]=F45pat[patnum][2];
  25.     pat=*(int *) (&buf);
  26.  
  27.     b=23;
  28.     for( y=0; y<5; y++ ){ ; for( x=0; x<4; x++ ){
  29.         if( (pat&(1<<b)) ){
  30.             pset(fx+x,fy+y,0xf);    //
  31.         }
  32.         b--;
  33.     }}
  34.  
  35.     return((int) F45patWidth[patnum]);
  36. }
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. /*    タブスペース変換:変換後のバイト数を返す
  45.  
  46. 0d,0aとばす
  47.  
  48. */
  49. int    detab(src,dest)
  50. unsigned char *src,*dest;
  51. {
  52.     unsigned char *s,*d;
  53.     short    x,i,m;
  54.     
  55.     s=src;
  56.     d=dest;
  57.     x=0;
  58.     while( *s ){
  59.         switch( *s ){
  60.             case '\t':
  61.                 m=x%8;
  62.                 if( m==0 ){ m=8; }
  63.                 for( i=0; i<m; i++ ){
  64.                     *d++=' ';
  65.                     x++;
  66.                 }
  67.             break;
  68.             case '\x0d':
  69.             case '\x0a':
  70.                 ;//とばし
  71.             break;
  72.             default:
  73.                 *d++=*s;
  74.                 x++;
  75.             break;
  76.         }
  77.         s++;
  78.     }
  79.     *d=0;
  80.  
  81.     return(x);
  82. }
  83.  
  84.  
  85.  
  86. int    main(argc,argv)
  87. int    argc;
  88. char    *argv[];
  89. {
  90. #define    BUFSIZE    (256)
  91.     unsigned char    srcbuf[BUFSIZE],destbuf[BUFSIZE];    //@@いいかげん
  92.     unsigned char    typefile[128];
  93.     int    x,y,xlen,w,px;
  94.     FILE    *fp;
  95.     int    swidth=96,sheight=72;    //F502i
  96.     int    drawoffset_x=0,drawoffset_y=16;    //描画開始位置
  97.     int    nopro=1;        //プロポーショナルにしないフラグ
  98.     int    ac;
  99.  
  100.     typefile[0]=0;
  101.     for( ac=1; ac<argc; ac++ ){
  102.         if( argv[ac][0]=='/' || argv[ac][0]=='-' ){ ; switch( argv[ac][1] ){
  103.             case 'w': case 'W':
  104.                 sscanf(&argv[ac][2],"%d,%d",&swidth,&sheight);
  105.             break;
  106.             case 'o': case 'O':
  107.                 sscanf(&argv[ac][2],"%d,%d",&drawoffset_x,&drawoffset_y);
  108.             break;
  109.             case 'p': case 'P':
  110.                 nopro=0;    //プロポーショナルにする
  111.             break;
  112.         }}
  113.         else{
  114.             //オープンファイル名
  115.             strcpy(typefile,argv[ac]);
  116.         }
  117.     }
  118.     if( typefile[0]==0 ){
  119.         goto err;
  120.     }
  121.  
  122.     screen(2,0,1,1);
  123.     window(0,0,767,511);
  124.     apage(0);
  125.     vpage(0xf);
  126.     {
  127.         fp=fopen(typefile,"rt");
  128.         if( fp==NULL ){
  129. err:
  130.             printf(
  131.             "4x5ドットフォントを使ったテキストファイル表示(type)\n"
  132.             "usage : f45type typefile [option]\n"
  133.             "option: /Ww,h 表示領域サイズの設定(def:/W96,72)\n"
  134.             "      : /Ox,y 描画開始位置の設定(def:/O0,16)\n"
  135.             "      : /P    指定時のみプロポーショナル表示を行う\n"
  136.             );
  137.             goto quick_exit;
  138.         }
  139.     }
  140.     x=0;
  141.     y=0;
  142.     while( feof(fp)==0 ){
  143.         fgets(srcbuf,BUFSIZE,fp);
  144.         if( srcbuf[0]=='\n' ){
  145.             goto next;
  146.         }
  147.         xlen=detab(srcbuf,destbuf);
  148.         x=0;
  149.         px=0;
  150.         while(1){
  151.             for( px=0; px<swidth; ){
  152.                 if( destbuf[x]==0 ){ goto next; }
  153.                 w=putF45(px+drawoffset_x,y*6+drawoffset_y,(int) destbuf[x]);
  154.                 if( nopro ){ w=4; }
  155.                 px+=(w+1);
  156.                 x++;
  157.             }
  158.             y++;
  159.         }
  160. next:
  161.         y++;
  162.         if( y>(sheight/6) ){ break; }
  163.     }
  164.     {
  165.         fclose(fp);
  166.     }
  167.  
  168. quick_exit:
  169.     return(0);
  170. }
  171.  
  172.  
  173.